package three;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * 5. 编程题
 *
 *   使用基于 tcp 协议的编程模型实现多人同时在线聊天和传输文件，要求每个客户端将发 送的聊天内容和文件发送到服务器，服务器接收到后转发给当前所有在线的客户端。
 */
public class Server {
    private static ArrayList<Socket> online = new ArrayList<>();

    public static void main(String[] args) {
        //创建Socket对象
        try {
            ServerSocket s = new ServerSocket(9999);
            while (true) {
                //接收客户端的连接
                System.out.println("正在等待连接..");
                Socket socket = s.accept();
                System.out.println("客户端"+s.getInetAddress()+"连接成功！");

                //将连接上的客户端加入online
                online.add(socket);
                //每个客户端都有一个线程
                new ServerThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //私有的静态内部类
    //使用内部类的原因是为了使用上面的online
    private  static class ServerThread extends Thread {
        private Socket s;

        public ServerThread(Socket s) {
            super();
            this.s = s;
        }

        public void run() {
            //接收当前客户端发送的消息
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

                String st;
                while ((st = br.readLine()) != null) {
                    if ("bye".equalsIgnoreCase(st)) {
                        //给自己发一句bye
                        PrintStream ps = new PrintStream(s.getOutputStream());
                        ps.println("bye");
                        break;
                    }
                    //收到一句就转发一句
                    sendToOthers(st);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //转发给其他在线的客户端
        //因为转发的代码较多，这里自定义一个方法实现
        public void sendToOthers(String str) {
            Iterator<Socket> iterator = online.iterator();
            while (iterator.hasNext()) {
                //遍历在online中的所有客户端
                Socket on = iterator.next();
                if(!on.equals(s)) {//只给其他客户端转发
                    try {
                        PrintStream ps = new PrintStream(on.getOutputStream());

                        ps.println(str);
                    } catch (IOException e) {
                        //说明on客户端下线或者掉线了
                        iterator.remove();
                    }
                }
            }
        }
    }
}